import pyecharts.options as opts
from pyecharts.charts import Boxplot

# 将在 v1.1.0 中更改
from pyecharts.commons.utils import JsCode

"""
Gallery 使用 pyecharts 1.1.0
参考地址: https://www.echartsjs.com/examples/editor.html?c=boxplot-multi

目前无法实现的功能:

1、暂无
"""
axis_data = \
    ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
     "10", "11", "12", "13", "14", "15", "16", "17"]

data = [
    {
        "axisData": axis_data,
        "boxData": [
            [3.8888578346043534, 55.82692798765428, 98.71608835477272, 149.50917642877687, 196.31621070646452],
            [0.5174326704765253, 47.52990128406776, 103.66600287106233, 160.1380046605997, 194.8294269298398],
            [2.843900448603165, 51.773788199388605, 90.66830693679475, 152.19938074181786, 196.18172012742428],
            [2.6752702891334135, 42.85051429480143, 98.54433643572133, 166.81852013033875, 199.7400516615198],
            [1.665511467481906, 63.069856326089585, 123.20638438572043, 164.0932194814393, 199.56631692214057],
            [0.3597414263118992, 52.84424125860876, 108.14491539985673, 154.42390255012828, 199.39872381823812],
            [1.3380322954592128, 41.989379994726335, 100.39118095266713, 160.38742881881478, 197.8251968350275],
            [1.7005873932608662, 43.88170786936796, 92.29415890464293, 140.7858956683471, 197.50510824352313],
            [1.7017445023542965, 52.55872982785781, 90.26972335102536, 155.43082163069883, 198.31679368721197],
            [0.45657888665799895, 47.60747957375436, 95.53917053451289, 162.55256484073354, 199.78317232079928],
            [1.745438082254136, 53.450845301261964, 95.8847297380051, 143.99885640751006, 195.1863502057908],
            [2.5631287114048273, 56.04486879215165, 110.01592256847306, 155.33508398386462, 195.90291395560985],
            [3.4380745785991262, 58.07888602010247, 105.64925213947652, 165.50126442985191, 199.75877487248675],
            [0.03322930419802361, 53.363159200883985, 95.32936635574816, 151.39772626598614, 198.20394907387762],
            [0.7063564158257929, 73.89369564248534, 116.6947935806626, 152.93983211466667, 197.1481400480321],
            [0.9611585600880268, 46.64283650085793, 102.32004406296502, 148.64094149067978, 199.59803470854715],
            [1.4310036755643463, 50.15631363530299, 102.68128938225942, 147.52573154872948, 197.6018158750086],
            [0.492994684970105, 43.23619663302313, 99.60815322547333, 140.00299600143438, 198.97693156537883]
        ],
        "outliers": []
    },
    {
        "axisData": axis_data,
        "boxData": [
            [1.3866777918670525, 52.723984144413805, 112.16068484025186, 148.07060013196633, 196.6493886555634],
            [0.8675025485252785, 41.94008605353009, 90.4944101654473, 134.34314089904032, 199.57411732908722],
            [2.109917782227244, 47.361245156921306, 98.03121935506474, 152.57304498745683, 199.6655667235125],
            [0.835914742081334, 45.90386054869363, 110.8008994981315, 153.77050147012113, 198.17687983907325],
            [0.09929780808608513, 55.313979741487245, 80.36049651385588, 144.5076321261422, 198.71007594348265],
            [4.3591904343687204, 53.098201381124454, 88.8716562277704, 134.2243571501588, 197.86166497124387],
            [1.4751642002043486, 52.87727910767818, 98.1167484613283, 129.123794134296, 199.26128215126036],
            [1.0208468961246275, 59.72883452828452, 93.7117188714775, 133.6955646934541, 199.04002574913483],
            [5.700580454086168, 62.30214699943758, 109.4858546359291, 144.37435834128183, 196.80025087232633],
            [3.8776389962399627, 47.07485197991684, 108.77911010272065, 143.55929331063112, 199.78963194031576],
            [0.9206486824532956, 56.531536633466786, 103.22722183226676, 153.71850265606832, 199.26707930050713],
            [1.2238397462105866, 42.37213742602606, 85.0161099008823, 144.6618761115177, 195.68883739488717],
            [1.383845313528731, 55.58975449585246, 101.2502031542653, 155.4651069256266, 198.51896538541257],
            [2.460600698918336, 45.35279677561122, 86.22855211501036, 142.2985968944624, 196.88095181245973],
            [1.5771786133238486, 47.74919144071982, 98.25948642595273, 143.6080569193598, 199.35657813436302],
            [1.679597195618454, 54.03099324959242, 93.24925248108138, 156.2197398880975, 199.96087190538344],
            [0.09445769268561222, 62.987289799985746, 93.5536375308287, 146.10299624484736, 198.89381360902073],
            [0.5074418255246016, 43.16902467382945, 97.5036007943674, 150.07249687988744, 197.1438186145631]
        ],
        "outliers": []
    },
    {
        "axisData": axis_data,
        "boxData": [
            [0.17336583192690824, 38.89251480694969, 95.24827036951726, 144.42455874548153, 199.4034309165705],
            [3.676663641014155, 56.915752270243615, 116.52533365244228, 154.9613826361874, 199.45242610474344],
            [0.2637149176087039, 39.10809721270764, 83.11646124189903, 145.85305644883107, 199.4425993969723],
            [0.9435517891188017, 59.34726771939571, 116.9100457332774, 154.6830501745436, 197.360203327316],
            [3.979089227580568, 59.55958857930115, 106.50956069508263, 154.19233153204274, 198.27863048295953],
            [0.2254389425328185, 45.14272916122666, 101.99744565544017, 158.20585382578935, 199.87918467096276],
            [0.4981747166813655, 55.07500323828029, 98.06775843874871, 142.6740673515219, 196.17733451641203],
            [3.459413844168191, 48.45434370508197, 90.08287035261958, 144.44636703035508, 196.7330418635301],
            [5.491046107788211, 51.726853187011294, 102.73451029578627, 144.81711164442441, 198.8867176824325],
            [0.7550472434538769, 52.51096431201062, 107.88318214869264, 159.26961432919137, 199.61830476130777],
            [0.2752001848587593, 48.7398963427885, 89.75616732426943, 142.05594236584855, 198.3147751483816],
            [1.4946063684317945, 47.50894653631401, 98.11186814575922, 138.51943571666908, 193.3052139732351],
            [0.20882224269564986, 51.28631550804623, 107.81597798598389, 160.02354609263347, 199.2878557923929],
            [0.8976637474841898, 43.66029575375894, 100.62231619788403, 139.9661197041632, 192.54845617677],
            [5.859745717489284, 47.03805156535355, 108.41470873842098, 157.096784096105, 199.9179863824041],
            [3.7257707586363598, 42.231249941095996, 97.356821000705, 142.79191220154834, 198.84036692134],
            [1.8454208635465985, 44.91333687646406, 98.65350096972611, 143.39018022926803, 199.87483964263296],
            [0.5514923538800787, 45.85216189462081, 99.9806157446917, 153.32082407525542, 198.2776454910153]
        ],
        "outliers": []
    },
    {
        "axisData": axis_data,
        "boxData": [
            [0.7168805200240325, 46.53681449735687, 97.29254353668016, 156.63006806530143, 199.3015739378797],
            [1.7193486665883828, 62.95172603462959, 112.02740143118092, 156.0538383864632, 199.26142301676774],
            [2.1369256823901672, 57.21732276358834, 103.36834727083514, 153.72092303549277, 198.79539179393552],
            [0.032880351113817596, 47.562260234793726, 96.26764103515997, 145.73458375286407, 199.06617414977254],
            [0.4401537603581307, 43.865273442582165, 94.93675834281308, 146.35738146359748, 193.64127816517245],
            [0.3961689590249673, 50.96909350725202, 104.73604524329194, 148.23414082526403, 198.8856874527377],
            [0.21937305368529003, 49.59183574690416, 102.85949468466653, 163.6266324963084, 199.69745130954797],
            [0.6248639849676607, 43.65587924550377, 98.38900488209111, 152.00850019757138, 197.66849547068205],
            [0.8836653304501674, 51.715354680095054, 106.27634207918453, 152.75520182409605, 198.7026018674421],
            [7.037170236614809, 60.499053468218285, 99.70265208133726, 145.547153860169, 197.56589704383606],
            [0.191005947981715, 36.77501191389064, 78.79138996882105, 138.31773623910374, 199.5549011391389],
            [2.085660638228548, 50.85562917320624, 100.31437027035244, 144.07227532917557, 199.9671689855977],
            [2.8329465269889997, 46.64735576556238, 95.58042897665536, 150.95016495791145, 199.01002263253537],
            [2.9140730838620232, 55.8981643150491, 99.12490122897461, 138.35381332244458, 197.89764340001602],
            [0.6900722343886834, 61.20627193426343, 108.73896996351209, 152.38197094149575, 199.49695739258172],
            [0.3519848056308117, 51.38799178079926, 108.74191700174138, 146.60812022274987, 198.09008264810322],
            [0.2761553645218129, 56.388967149570455, 104.8697135719724, 153.5049030271958, 199.5731857965878],
            [3.5557869592812708, 46.14828237062535, 108.66363220203428, 160.07663258712037, 199.1028921688903],
        ],
        "outliers": []
    },
    {
        "axisData": axis_data,
        "boxData": [
            [2.979477505147443, 39.75713406508555, 94.53079422141971, 156.08283690923398, 199.44795240229735],
            [2.6484190473881064, 39.93623770385512, 77.27669464380185, 128.4315475425753, 199.56482718369725],
            [0.027555734890816197, 57.0338837796717, 108.81399073964846, 148.06814743102228, 199.60110925244555],
            [5.095524117378636, 61.306047315630614, 110.93776130670011, 156.1408460056575, 195.24807037634693],
            [2.728611345602383, 44.56605304153001, 82.24512299722713, 147.52018338217582, 197.4401254594119],
            [3.2844003726598903, 31.22917030540313, 98.82341804522095, 147.37909270120065, 195.31234405750303],
            [0.18212434446978065, 59.703454603359305, 103.67261216911498, 144.78603398715182, 197.894221292169],
            [2.0723859910971587, 65.62630968779271, 108.08425190082599, 153.04828999176155, 198.71953877580813],
            [0.9675695750262392, 52.06976077477188, 106.44774448853506, 153.71491587328123, 199.9367145735771],
            [2.5328359424461766, 54.040914797213425, 98.74095548976766, 156.68297214273787, 199.54362057796757],
            [1.1331529861684952, 44.39864814947693, 88.34657630798353, 137.22778263394855, 198.83623456218217],
            [0.03400372259445561, 39.0412178839992, 82.44989003395962, 142.39781316172628, 198.66240858068616],
            [3.3739669830866514, 51.553716623716575, 113.01026058884891, 165.92964939460416, 198.22988431223231],
            [1.7144280578984095, 52.52972703008254, 97.47299182400204, 134.9644807802092, 198.46967348342878],
            [1.7893968468841948, 43.87294943558785, 90.42735899685948, 143.0586276081752, 197.6798595904976],
            [4.299131337916773, 50.29192506963852, 104.5869339834448, 163.2705302681331, 199.10157077449355],
            [0.6740610620747933, 54.02651804107089, 86.12616850846155, 137.7008290515613, 199.78999859299336],
            [0.5370189113081292, 50.44519588101707, 98.08928065026996, 139.8482090057953, 197.20820681141507],
        ],
        "outliers": []
    }
]

(
    Boxplot(init_opts=opts.InitOpts(width="1600px", height="800px"))
    .add_xaxis(xaxis_data=axis_data)
    .add_yaxis(
        series_name="category0",
        y_axis=data[0]["boxData"],
        tooltip_opts=opts.TooltipOpts(
            formatter=JsCode("""function(param) { return [
                            'Experiment ' + param.name + ': ',
                            'upper: ' + param.data[0],
                            'Q1: ' + param.data[1],
                            'median: ' + param.data[2],
                            'Q3: ' + param.data[3],
                            'lower: ' + param.data[4]
                        ].join('<br/>') }""")
        )
    )
    .add_yaxis(
        series_name="category1",
        y_axis=data[1]["boxData"],
        tooltip_opts=opts.TooltipOpts(
            formatter=JsCode("""function(param) { return [
                            'Experiment ' + param.name + ': ',
                            'upper: ' + param.data[0],
                            'Q1: ' + param.data[1],
                            'median: ' + param.data[2],
                            'Q3: ' + param.data[3],
                            'lower: ' + param.data[4]
                        ].join('<br/>') }""")
            )
    )
    .add_yaxis(
        series_name="category2",
        y_axis=data[2]["boxData"],
        tooltip_opts=opts.TooltipOpts(
            formatter=JsCode("""function(param) { return [
                            'Experiment ' + param.name + ': ',
                            'upper: ' + param.data[0],
                            'Q1: ' + param.data[1],
                            'median: ' + param.data[2],
                            'Q3: ' + param.data[3],
                            'lower: ' + param.data[4]
                        ].join('<br/>') }""")
        )
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="Multiple Categories", pos_left="center"),
        legend_opts=opts.LegendOpts(pos_top="3%"),
        tooltip_opts=opts.TooltipOpts(trigger="item", axis_pointer_type="shadow"),
        xaxis_opts=opts.AxisOpts(
            name_gap=30,
            boundary_gap=True,
            splitarea_opts=opts.SplitAreaOpts(
                areastyle_opts=opts.AreaStyleOpts(opacity=1)),
            axislabel_opts=opts.LabelOpts(formatter="expr {value}"),
            splitline_opts=opts.SplitLineOpts(is_show=False)
        ),
        yaxis_opts=opts.AxisOpts(
            type_="value", min_=-400, max_=600,
            splitarea_opts=opts.SplitAreaOpts(is_show=False)
        ),
        datazoom_opts=[
            opts.DataZoomOpts(type_="inside", range_start=0, range_end=20),
            opts.DataZoomOpts(type_="slider", xaxis_index=0, is_show=True)
        ]
    )
    .render("multiple_categories.html")
)
